// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "media/filters/in_memory_url_protocol.h"

#include "media/ffmpeg/ffmpeg_common.h"

namespace media {

InMemoryUrlProtocol::InMemoryUrlProtocol(const uint8_t* data,
    int64_t size,
    bool streaming)
    : data_(data)
    , size_(size >= 0 ? size : 0)
    , position_(0)
    , streaming_(streaming)
{
}

InMemoryUrlProtocol::~InMemoryUrlProtocol() { }

int InMemoryUrlProtocol::Read(int size, uint8_t* data)
{
    if (size < 0)
        return AVERROR(EIO);

    int64_t available_bytes = size_ - position_;
    if (size > available_bytes)
        size = available_bytes;

    if (size > 0) {
        memcpy(data, data_ + position_, size);
        position_ += size;
    }

    return size;
}

bool InMemoryUrlProtocol::GetPosition(int64_t* position_out)
{
    if (!position_out)
        return false;

    *position_out = position_;
    return true;
}

bool InMemoryUrlProtocol::SetPosition(int64_t position)
{
    if (position < 0 || position > size_)
        return false;
    position_ = position;
    return true;
}

bool InMemoryUrlProtocol::GetSize(int64_t* size_out)
{
    if (!size_out)
        return false;

    *size_out = size_;
    return true;
}

bool InMemoryUrlProtocol::IsStreaming()
{
    return streaming_;
}

} // namespace media
